Pourquoi tester?
Un exemple concret de test obligatoire : Asciidoctor.org
Un exemple concret de documentation obligatoire : Eclipse
Typologie des tests
JUnit etc.
Application concrète pour ce cours
A majority of the production failures (77%) can be reproduced by a unit test.
Yuan et al. OSDI 2014
| Un tweet récent! |
| Pour lire l’article en question : https://blog.acolyer.org/2016/10/06/simple-testing-can-prevent-most-critical-failures/amp/ |
Tout ce qui est susceptible de mal tourner tournera nécessairement mal.
Edward A. Murphy Jr.
| Autour d’une bière avec Dan Allen, à Denver, Colorado #ILoveMyJob |
bundle to install development dependencies.bundle exec rake to run the tests.
If your tests pass, return to step 4.bundle exec rake to run the tests.
If your tests fail, return to step 6.| Après un footing avec Gaël Blondel, à Saint-Malo #ILoveMyJob |
[…] an Eclipse project is providing extensible frameworks and applications accessible via documented APIs.
Eclipse Development Process
Vérification | Validation |
Le produit est-il bon ? | Le produit est-il le bon ? |
Are you building it right? | Are you building the right thing? |
Réalisée par le développeur | Réalisée par le testeur |
En premier | Après la vérification |
Les exceptions |
|
Le temps d’exécution |
|
Uniquement certains environnement |
|
S’exécute avant les autres tests (e.g., accès à une base) |
|
| On force le test à échouer |
| La condition est vraie |
| La condition est fausse |
| Les deux valeurs sont égales |
| Objet nul |
| Objets identiques (même réf.) |
Considérons une fonction int add(int,int); d’une classe myClass.
Définir le comportement normal de la fonction (sortie normale pour des paramètres corrects).
//for normal addition
@Test
public void testAdd1Plus1() {
int x = 1 ; int y = 1;
assertEquals(2, myClass.add(x,y));
}Ajouter des tests pour les cas particuliers :
null sont gérés, e.g., ://if you are using 0 as default for null, make sure your class works in that case.
@Test
public void testAdd1Plus1() {
int y = 1;
assertEquals(1, myClass.add(null,y));
}Surtout aucun!!
JUnit assumes that all test methods can be executed in an arbitrary order. Well-written test code should not assume any order, i.e., tests should not depend on other tests.
JUnit manual
Pensez à utiliser le plug-in infinitest.
Exemple de la librairie Robot :
Robot bot = new Robot();
bot.mouseMove(10,10);
bot.mousePress(InputEvent.BUTTON1_MASK);
//add time between press and release or the input event system may
//not think it is a click
try{Thread.sleep(250);}catch(InterruptedException e){}
bot.mouseRelease(InputEvent.BUTTON1_MASK);Exemple du plugin Eclipse swingcoder :
Il existe des outils pour aller plus loin :
bruel (master) $ git checkout -b US-15378
Switched to a new branch 'US-15378'
bruel (US-15378) $Exemmple : Objectif de la tâche = créer une classe Pile.
CréerPile : -> Pile estVide : Pile -> Booléen Empiler : Pile * Elément -> Pile Dépiler : Pile -> Pile Sommet : Pile -> Elément |
Sommet(p) valide Si et Seulement Si estVide(p) == FAUX Dépiler(p) valide Si et Seulement Si estVide(p) == FAUX |
(1) estVide(CréerPile()) (2) estVide(Empiler(p,e)) == FAUX (3) estVide(Dépiler(Empiler(p,e))) Si et Seulement Si estVide(p) (4) Sommet(Empiler(p,e)) == e (5) !estVide(p) => Sommet(Dépiler(Empiler(p,e))) == Sommet(p) |
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
public class PileTest {
@Test
public void test_type_new_Pile() throws Exception {
Pile pile = new Pile() ;
assertEquals("Pile", pile.getClass().getName(),"new Pile() retourne une Pile");
}
}| Oups, JUnit n’est pas dans le path… |
| Création rapide de la classe `Pile` |
| Run as JUnit Tests |
@Test
public void test_type_empiler() throws Exception {
Pile pile = new Pile() ;
assertEquals("Pile", pile.empiler("XXX").getClass().getName(),"empiler(pile,'XXX') retourne une Pile");
}| Erreur de syntaxe |
public class Pile {
public Object empiler(String string) {
// TODO Auto-generated method stub
return this;
}
}La méthode générée par défaut retourne |
public class Pile {
public Pile empiler(String string) {
// TODO Auto-generated method stub
return new Pile();
}
}@Test
public void test_axiome1() {
Pile pile = new Pile() ;
assertTrue(pile.estVide(pile),"Une nouvelle pile est vide");
} public boolean estVide(Pile pile) {
// TODO Auto-generated method stub
return false;
}| Passage du test |
Junit n’exécute que les fonctions qui commencent pas |
public boolean estVide(Pile pile) {
// Smartly modified by JMB to pass the test!
return true;
}| Passage du test |
Bien sûr le code n’est pas correcte pour l’instant (on s’en rendra compte dès les tests suivants)! Une meilleure solution pourrait être : |
bruel (US-15378) $ git commit -am "Adding push feature. Tests OK"
[US-15378 78f3242] Adding push feature. Tests OK
1 file changed, 2 insertions(+), 3 deletions(-)
bruel (US-15378) $ git checkout devs
Switched to branch 'devs'
bruel (devs) $ git merge US-15378devsbruel (devs) $ git commit -am "..."
...
bruel (devs) $ git push origin devs
...
bruel (devs) $ git branch -D US-15378
Deleted branch US-15378 (was f392a73).On going à Review| Penser à mettre à jour le tableau de bord |
| Bad | Good |
|---|---|
| Bad | Good |
|---|---|
Then, you just need to open a cmd here and type "ant run". | Lancer la commande "ant build". |
Position yourself in the project repository (
C:\Users\Etudiant\Desktop\Nouveau dossier\MPA2018-Gxxx)
Anonymous
Pour lancer l’application, lancer
ant Interface
Extrait de la Doc. Utilisateur
$ ant Interface
BUILD FAILED
Target "Interface" does not exist in the project ...build.xml qui manque…Pour lancer l’application, lancer
ant
Extrait de la Doc. Utilisateur
$ ant
Buildfile: build.xml does not exist!G1A2 | 0 |
G1A3 | 4 |
G1A5 | 1 |
G1A6 | 5 |
G1A7 | 0 |
G1B1 | 21 |
G1B4 | 3 |
G2A1 | 8 |
G2B1 | 0 |
G2B2 | 3 |
G2B3 | 1 |
G3A1 | 77 |
G3A2 | 2 |
G3B1 | 5 |
G3B2 | 5 |
G3B3 | 0 |
G4A1 | 0 |
G4A2 | 0 |
G4A3 | 0 |
Groupe | # classes de test | # tests | Status |
1A1 | 1 | ~30 | |
1A2 | 1 | 1 | |
1B1 | 1 | ~10 | |
1B2 | ? | 2 |
État des builds et des tests (au 08/10/2016 à 22h40)
Groupe | # classes de test | # tests | Status |
2A1 | 0 | 0 | |
2A2 | 1 | ~10 | |
2B1 | 2 | ~10 | |
2B2 | 0 | 0 |
État des builds et des tests (au 08/10/2016 à 22h40)
QUESTION
|